深度解析丨你不知道的eBPF-Android系统监测方案
一、前言
传统的Android动态监测工具,例如frida/ strace,都运行在用户空间。由于现在越来越多的应用程序都采用了反调试技术, 这也导致frida/strace在逆向的时候往往无法正常工作。
因此,有些人一直在编写内核模块来实现调试工具,以避免用户空间检测。但是,目标应用程序仍然可以利用对应的手段找到加载的内核模块。
相比之下,eBPF 程序具有与内核模块相同的访问级别,同时,编写和维护起来要容易得多,这也使得eBPF在Android 动态检测方面发挥越来越大的作用。
二、具体功能点
本次 eBPF Android 环境是基于cuttlefish、custom kernel、adeb、bcc 的组合,具体功能点如下:
adeb: 在cuttlefish设备上安装adeb
kernel: 使用所需的内核配置构建自定义内核
cuttlefish: 在 KVM 上构建和设置cuttlefish设备
bcc: 使用 adb 在设备的 Debian 环境中构建和安装 bcc。
三、操作步骤
eBPF 和 bcc 依赖于许多内核中没有的功能,因此必须提前选择自己所需的内核功能用例,这点至关重要。
具体可以参考以下收集的配置信息,这些标志以Android配置文件的格式编写,因此可以直接将其复制并粘贴到构建配置文件中。
-d表示删除标志,-e表示添加标志。
特征 | 标志 |
Default gki_kprobe configs in common-kernel - Disable kernel security features | -d CONFIG_LTO \ -d CONFIG_LTO_CLANG \ -d CONFIG_CFI_CLANG \ -d CFI_PERMISSIVE \ -d CFI_CLANG \ -e CONFIG_IRQSOFF_TRACER \ -e CONFIG_PREEMPT_TRACER \ -e CONFIG_DEBUG_FS \ -e CONFIG_CHECKPOINT_RESTORE \ -d CONFIG_RANDOMIZE_BASE \ |
Enable eBPF support | -e CONFIG_BPF \ -e CONFIG_BPF_SYSCALL \ -e CONFIG_BPF_JIT \ -e CONFIG_HAVE_EBPF_JIT \ -e CONFIG_IKHEADERS \ |
Enable kprobe | -e CONFIG_HAVE_KPROBES \ -e CONFIG_KPROBES \ -e CONFIG_KPROBE_EVENT \ |
Enable kretprobe | -e CONFIG_KRETPROBES \ -e CONFIG_HAVE_KRETPROBES \ -d CONFIG_SHADOW_CALL_STACK \ -e CONFIG_ROP_PROTECTION_NONE\ |
Enable uprobe | -e CONFIG_UPROBES \ -e CONFIG_UPROBE_EVENT \ -e CONFIG_BPF_EVENTS \ |
[BCC tool] tc filters and tc actions | -e CONFIG_NET_CLS_BPF \ -e CONFIG_NET_ACT_BPF \ |
[BCC tool] bcc networking examples | -e CONFIG_NET_SCH_SFQ \ -e CONFIG_NET_ACT_POLICE \ -e CONFIG_NET_ACT_GACT \ -e CONFIG_DUMMY \ |
[BCC tool] critical | -e CONFIG_DEBUG_PREEMPT \ -e CONFIG_PREEMPTIRQ_EVENTS \ -d CONFIG_PROVE_LOCKING \ -d CONFIG_LOCKDEP |
[bpftrace] Enable ftrace | -e CONFIG_FTRACE_SYSCALLS \ -e CONFIG_FUNCTION_TRACER \ -e CONFIG_HAVE_DYNAMIC_FTRACE \ -e CONFIG_DYNAMIC_FTRACE \ |
3.2.1、同步映像源文件
本次下载的内核源代码分支为:common-android-4.19-stable,如果您不熟悉如何构建 Android kernel,请先阅读官方的说明:
https://source.android.com/setup/build/building-kernels
3.2.2、扩展内核功能
修改配置文件common/build.config.gki_kprobes
修改配置文件common-modules/virtual-device/build.config.cuttlefish_kprobes.x86_64
ommon/Makefile文件头部
3.2.3 构建内核文件
构建通用内核和特定的供应商内核,该命令应在输出文件夹中生成和bzImage和initramfs.img,如下图:
使用我们之前构建的内核和初始化器启动一个 cuttlefish VM,命令如下:
到现在为止,能够通过adb命令看到创建的cuttlefish设备。现在下载并安装 adeb,请注意,adeb 默认为生成arm64架构的设备,而我们的cuttlefish是x86_64架构的设备,因此我们必须指定使用如下命令安装x86_64架构的bcc程序。
完成后,尝试进入设备,测试安装的bcc工具,(下图将展示:利用sslsniff在无需安装安卓证书的情况下抓取HTTPS明文数据):
四、小结
尽管eBPF在Android系统下的应用场景还不是很成熟,严格受限于Kernel版本和Kernel的可扩展程度;随着Android 版本和Android Kernel的持续更新,新版Android系统必将会使用到更多的eBPF功能或特性,这也预示着eBPF日后将在Android中得到更广泛的应用,不仅仅局限于目前的安全和监测方面。
参考文章
[1] Android 通用内核
https://source.android.com/devices/architecture/kernel/android-common
[2] Cuttlefish 虚拟 Android 设备
https://source.android.com/setup/create/cuttlefish
[3] Installing BCC
https://github.com/iovisor/bcc/blob/master/INSTALL.md
[4]构建内核
https://source.android.com/setup/build/building-kernels
[5] Cuttlefish Getting Started
https://android.googlesource.com/device/google/cuttlefish/
[6] eBPF super powers on ARM64 and Android
http://www.joelfernandes.org/resources/bcc-ospm.pdf
[7] BCC (BPF compiler collection) for Android
https://github.com/joelagnel/adeb/blob/master/BCC.md
[8] BPF Features by Linux Kernel Version
https://github.com/iovisor/bcc/blob/master/docs/kernel-versions.md
[9] Introduction to virtio-networking and vhost-net
https://www.redhat.com/en/blog/introduction-virtio-networking-and-vhost-net
[10] Linux vsock internals
https://terenceli.github.io/%E6%8A%80%E6%9C%AF/2020/04/18/vsock-internals
[11] Kernel analysis using eBPF
https://elinux.org/images/d/dc/Kernel-Analysis-Using-eBPF-Daniel-Thompson-Linaro.pdf
精彩文章推荐